#!/usr/bin/env python3
"""
WMS Sample 生产环境打包脚本
创建完全独立的exe部署包，支持傻瓜化操作
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path
from datetime import datetime

def create_production_package():
    """创建生产环境部署包"""
    print("========================================")
    print("WMS Sample 生产环境打包")
    print("适用于无Python环境的服务器")
    print("========================================")
    
    # 创建部署目录
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    package_name = f"WMS_Sample_v2.1.0_Production_{timestamp}"
    deployment_dir = Path(package_name)
    deployment_dir.mkdir(exist_ok=True)
    
    print(f"创建部署包: {package_name}")
    
    # === 打包主程序 ===
    print("\n=== 打包主程序 ===")
    try:
        # 确保使用干净的数据库
        print("准备干净的数据库...")
        subprocess.run([sys.executable, "scripts/prepare_for_packaging.py"], check=True)
        
        # 使用干净环境的spec文件进行打包 (排除了大量不必要的依赖)
        spec_file = "wms_clean.spec"
        if not Path(spec_file).exists():
            print(f"❌ 找不到spec文件: {spec_file}")
            return False
            
        # 使用干净环境的PyInstaller
        pyinstaller_path = "wms_clean_env/Scripts/pyinstaller.exe"
        if not Path(pyinstaller_path).exists():
            print(f"❌ 找不到干净环境的PyInstaller: {pyinstaller_path}")
            return False
            
        cmd = [
            pyinstaller_path,
            "--clean",
            "--distpath", str(deployment_dir),
            spec_file
        ]
        
        print("正在打包，请稍候...")
        print(f"执行命令: {' '.join(cmd)}")
        print("=" * 60)
        
        # 不捕获输出，让用户看到完整的打包过程
        result = subprocess.run(cmd)
        
        if result.returncode == 0:
            print("=" * 60)
            print("✅ 主程序打包成功")
            
            # PyInstaller目录模式会创建一个包含exe和_internal的文件夹
            # 我们需要将整个wms_simple文件夹的内容移动到部署目录根目录
            wms_simple_dir = deployment_dir / "wms_simple"
            if wms_simple_dir.exists():
                # 移动wms_simple目录中的所有内容到部署目录根目录
                for item in wms_simple_dir.iterdir():
                    target_path = deployment_dir / item.name
                    if item.is_dir():
                        if target_path.exists():
                            shutil.rmtree(target_path)
                        shutil.move(str(item), str(target_path))
                    else:
                        if target_path.exists():
                            target_path.unlink()
                        shutil.move(str(item), str(target_path))
                
                # 重命名exe文件
                exe_file = deployment_dir / "wms_simple.exe"
                if exe_file.exists():
                    exe_file.rename(deployment_dir / "WMS_Sample.exe")
                
                # 删除空的wms_simple目录
                if wms_simple_dir.exists():
                    shutil.rmtree(wms_simple_dir)
                print("✅ 程序文件已正确部署")
            else:
                print("⚠️  找不到wms_simple目录，请检查打包结果")
                # 列出部署目录内容
                print("部署目录内容:")
                for item in deployment_dir.iterdir():
                    print(f"  - {item.name}")
        else:
            print("=" * 60)
            print(f"❌ 主程序打包失败，返回码: {result.returncode}")
            return False
            
    except Exception as e:
        print(f"❌ 打包过程出错: {e}")
        return False
    
    # 2. 复制必要的配置和数据文件
    print("\n=== 准备部署文件 ===")
    
    # 复制配置文件
    shutil.copy2("config.json", deployment_dir / "config.json")
    print("✅ 配置文件")
    
    # 复制干净的数据库
    data_dir = deployment_dir / "data"
    data_dir.mkdir(exist_ok=True)
    if Path("data/wmssimple.db").exists():
        shutil.copy2("data/wmssimple.db", data_dir / "wmssimple.db")
        print("✅ 数据库文件（干净版本）")
    
    # 创建日志目录
    logs_dir = deployment_dir / "logs"
    logs_dir.mkdir(exist_ok=True)
    print("✅ 日志目录")
    
    # 复制文档
    if Path("docs").exists():
        shutil.copytree("docs", deployment_dir / "docs")
        print("✅ 使用文档")
    
    # 3. 创建傻瓜化启动脚本
    print("\n=== 创建启动脚本 ===")
    
    # 主启动脚本
    start_script = deployment_dir / "启动WMS系统.bat"
    with open(start_script, 'w', encoding='gbk') as f:
        f.write("""@echo off
title WMS Sample 仓库管理系统
color 0A
echo.
echo ========================================
echo    WMS Sample 仓库管理系统 v2.1.0
echo ========================================
echo.
echo 正在启动系统，请稍候...
echo.
echo 启动成功后，请在浏览器中访问：
echo http://localhost:8000
echo.
echo 按 Ctrl+C 可以停止系统
echo ========================================
echo.

WMS_Sample.exe

echo.
echo 系统已停止运行
echo 如需重新启动，请再次运行此脚本
pause
""")
    print("✅ 主启动脚本")
    
    # 系统检查脚本
    check_script = deployment_dir / "检查系统.bat"
    with open(check_script, 'w', encoding='gbk') as f:
        f.write("""@echo off
title 系统检查
color 0B
echo.
echo ========================================
echo    WMS Sample 系统检查
echo ========================================
echo.

set /a count=0

if exist WMS_Sample.exe (
    echo [OK] 主程序文件存在
    set /a count+=1
) else (
    echo [ERROR] 主程序文件不存在
)

if exist config.json (
    echo [OK] 配置文件存在
    set /a count+=1
) else (
    echo [ERROR] 配置文件不存在
)

if exist data\\wmssimple.db (
    echo [OK] 数据库文件存在
    set /a count+=1
) else (
    echo [ERROR] 数据库文件不存在
)

if exist docs\\ (
    echo [OK] 文档目录存在
    set /a count+=1
) else (
    echo [ERROR] 文档目录不存在
)

echo.
if %count%==4 (
    echo [SUCCESS] 系统检查通过！可以正常使用
    echo 请运行"启动WMS系统.bat"启动系统
) else (
    echo [WARNING] 系统检查发现问题，请检查缺失的文件
)

echo.
pause
""")
    print("✅ 系统检查脚本")
    
    # 4. 创建用户友好的说明文件
    print("\n=== 创建使用说明 ===")
    
    # 简单的使用说明
    readme_file = deployment_dir / "使用说明.txt"
    with open(readme_file, 'w', encoding='utf-8') as f:
        f.write(f"""
========================================
  WMS Sample 仓库管理系统 v2.1.0
========================================

🎯 这是什么？
这是一个仓库管理系统，用于管理料盘和样品。

🚀 如何使用？
1. 双击运行"检查系统.bat"确认系统正常
2. 双击运行"启动WMS系统.bat"启动系统
3. 打开浏览器，访问 http://localhost:8000
4. 开始使用系统管理料盘和样品

📁 文件说明：
├── WMS_Sample.exe          主程序（核心文件）
├── 启动WMS系统.bat         启动脚本（双击运行）
├── 检查系统.bat            系统检查（双击运行）
├── 使用说明.txt            本文件
├── config.json             配置文件（可修改端口等）
├── data/                   数据目录
│   └── wmssimple.db       数据库文件
├── logs/                   日志目录（自动生成）
└── docs/                   详细文档

⚙️ 配置说明：
- 默认端口：8000
- 如需修改端口，编辑 config.json 文件
- 首次运行会自动创建默认料盘数据

🔧 常见问题：
1. 启动失败？
   - 检查端口8000是否被占用
   - 运行"检查系统.bat"检查文件完整性

2. 无法访问网页？
   - 确认系统已启动（看到启动成功提示）
   - 检查浏览器地址：http://localhost:8000

3. 需要技术支持？
   - 查看 docs/ 目录中的详细文档
   - 检查 logs/ 目录中的日志文件

📞 技术信息：
- 系统版本：v2.1.0
- 打包时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
- 适用系统：Windows 10+, Windows Server 2016+
- 无需安装Python或其他软件

🎉 开始使用吧！
双击"启动WMS系统.bat"即可开始！
""")
    print("✅ 用户使用说明")
    
    # 管理员说明
    admin_file = deployment_dir / "管理员说明.txt"
    with open(admin_file, 'w', encoding='utf-8') as f:
        f.write(f"""
========================================
  WMS Sample 管理员说明
========================================

📋 部署清单：
✅ 独立exe程序（无需Python环境）
✅ 完整数据库（干净版本，首次运行自动初始化）
✅ 生产环境配置
✅ 完整文档和日志系统
✅ 傻瓜化启动脚本

🖥️ 服务器要求：
- Windows 10+ 或 Windows Server 2016+
- 2GB+ 内存
- 100MB+ 硬盘空间
- 网络端口8000可用

📦 部署步骤：
1. 将整个文件夹复制到服务器
2. 运行"检查系统.bat"验证
3. 运行"启动WMS系统.bat"启动
4. 访问 http://服务器IP:8000 使用

⚙️ 配置修改：
编辑 config.json 文件可以修改：
- 端口号（默认8000）
- 日志级别
- 数据库路径
- 其他系统参数

🔒 安全建议：
- 建议在内网环境使用
- 定期备份 data/ 目录
- 监控 logs/ 目录的日志文件

📊 监控和维护：
- 日志文件：logs/wms.log
- 数据库文件：data/wmssimple.db
- 配置文件：config.json

🆘 故障排除：
1. 端口占用：修改config.json中的端口
2. 启动失败：检查logs/目录中的错误日志
3. 数据问题：备份并重新初始化数据库

📚 详细文档：
- docs/部署说明书.md - 完整部署指南
- docs/API文档.md - API接口说明
- docs/系统更新手册.md - 功能说明

版本信息：
- 系统版本：v2.1.0
- 打包时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
- 部署类型：生产环境独立部署包
""")
    print("✅ 管理员说明")
    
    # 5. 创建桌面快捷方式脚本
    shortcut_script = deployment_dir / "创建桌面快捷方式.bat"
    with open(shortcut_script, 'w', encoding='utf-8') as f:
        f.write("""@echo off
echo 正在创建桌面快捷方式...

set "current_dir=%~dp0"
set "desktop=%USERPROFILE%\\Desktop"

echo Set oWS = WScript.CreateObject("WScript.Shell") > "%temp%\\shortcut.vbs"
echo sLinkFile = "%desktop%\\WMS Sample 系统.lnk" >> "%temp%\\shortcut.vbs"
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> "%temp%\\shortcut.vbs"
echo oLink.TargetPath = "%current_dir%启动WMS系统.bat" >> "%temp%\\shortcut.vbs"
echo oLink.WorkingDirectory = "%current_dir%" >> "%temp%\\shortcut.vbs"
echo oLink.Description = "WMS Sample 仓库管理系统" >> "%temp%\\shortcut.vbs"
echo oLink.Save >> "%temp%\\shortcut.vbs"

cscript "%temp%\\shortcut.vbs" >nul
del "%temp%\\shortcut.vbs"

echo ✅ 桌面快捷方式创建成功！
echo 您可以在桌面找到"WMS Sample 系统"快捷方式
pause
""")
    print("✅ 桌面快捷方式脚本")
    
    # 6. 清理临时文件
    print("\n=== 清理临时文件 ===")
    if Path("build_temp").exists():
        shutil.rmtree("build_temp")
        print("✅ 临时构建文件已清理")
    
    # 7. 生成部署包信息
    package_size = sum(f.stat().st_size for f in deployment_dir.rglob('*') if f.is_file())
    package_size_mb = package_size / (1024 * 1024)
    
    print(f"\n========================================")
    print(f"🎉 生产环境部署包创建成功！")
    print(f"========================================")
    print(f"📦 部署包名称: {package_name}")
    print(f"📁 部署包位置: {deployment_dir.absolute()}")
    print(f"📊 部署包大小: {package_size_mb:.1f} MB")
    print(f"🎯 适用环境: Windows生产服务器（无需Python）")
    
    print(f"\n📋 部署包内容:")
    main_files = [
        "WMS_Sample.exe",
        "启动WMS系统.bat", 
        "检查系统.bat",
        "使用说明.txt",
        "管理员说明.txt",
        "config.json"
    ]
    
    for file in main_files:
        if (deployment_dir / file).exists():
            print(f"  ✅ {file}")
    
    print(f"  ✅ data/ (数据目录)")
    print(f"  ✅ docs/ (文档目录)")
    print(f"  ✅ logs/ (日志目录)")
    
    print(f"\n🚀 使用方法:")
    print(f"1. 将 {package_name} 文件夹复制到目标服务器")
    print(f"2. 双击运行 '检查系统.bat' 验证系统")
    print(f"3. 双击运行 '启动WMS系统.bat' 启动系统")
    print(f"4. 浏览器访问 http://localhost:8000 开始使用")
    
    print(f"\n💡 贴心提示:")
    print(f"- 所有操作都是双击运行，无需技术知识")
    print(f"- 系统会自动创建默认料盘数据")
    print(f"- 详细说明请查看部署包中的说明文件")
    
    return True

if __name__ == "__main__":
    print("准备为生产环境创建部署包...")
    success = create_production_package()
    
    if success:
        print("\n🎉 部署包创建成功！")
        print("现在可以将部署包复制到生产服务器了！")
    else:
        print("\n❌ 部署包创建失败！")
        print("请检查错误信息并重试。")
    
    input("\n按回车键退出...") 